package loginbackgroundfetcher;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ImageTools {
	/**
	 * 把所有的登录背景图像文件读入内存
	 * @return List<ImageFile>
	 * @throws IOException 读取错误是抛出异常
	 */
	public static List<ImageFile> loadImageFiles() throws IOException {
		List<ImageFile> files = new ArrayList<>();
		String folder = getImageFoler();
		File file = new File(folder);
		for (String fn : file.list()) {
			ImageFile imageFile = new ImageFile();
			imageFile.folder = folder;
			imageFile.filename = fn;
			readImageFile(imageFile);
			files.add(imageFile);
		}
		return files;
	}
	
	/**
	 * 保存图像到指定的文件
	 * @param file 要保存到的文件
	 * @param data 要保存的图像数据
	 * @throws IOException 失败时的异常
	 */
	public static void saveFile(File file, byte[] data) throws IOException {
		String fn = file.getAbsolutePath();
		// 如果不是 jpg 文件扩展名，加上jpg
		if (!fn.endsWith(".jpg")) {
			fn += ".jpg";
		}
		// 建立输出流
		try (FileOutputStream fos = new FileOutputStream(fn)) {
			// 写入文件
			fos.write(data);
		}
	}
	
	/**
	 * 获取登录背景图的文件夹
	 * 
	 * Win10登录界面壁纸保存位置如下：
	 * C:\Users\你的用户名\appdata\Local\Packages\Microsoft.Windows.ContentDeliveryManager_********\LocalState\Assets\
	 * 其中的你的用户名是你的电脑用户名，********是一串随机字符。
	 * 
	 * 使用环境变量 LOCALAPPDATA 可以取到  C:\Users\你的用户名\appdata\Local
	 * 
	 * @return 登录背景图的文件夹
	 */
	private static String getImageFoler() {
		// 使用环境变量 LOCALAPPDATA 可以取到  C:\Users\你的用户名\appdata\Local
		String localAppData = System.getenv("LOCALAPPDATA");
		File preFolder = new File(localAppData + "\\Packages");
		String fn = null;
		for (String f : preFolder.list()) {
			if (f.startsWith("Microsoft.Windows.ContentDeliveryManager_")) {
				fn = f;
				break;
			}
		}
		if (fn == null) {
			throw new RuntimeException("找不到登录背景图文件夹");
		}
		return preFolder.getAbsolutePath() + "\\" + fn + "\\LocalState\\Assets";
	}
	
	/**
	 * 读取指定的图像文件，数据保存到ImageFile对象的data变量中
	 * @param imageFile 图像文件对象
	 * @throws IOException 读取错误是抛出异常
	 */
	private static void readImageFile(ImageFile imageFile) throws IOException {
		// 图像文件对象
		File f = new File(imageFile.folder, imageFile.filename);
		// 读取的缓冲区
		byte[] buf = new byte[1024];
		// 输出流，要把读取的图像数据，写入到这个输出流中
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		// 建立输入流，读取数据
		try (FileInputStream bis = new FileInputStream(f)) {
			int len;
			// 读取数据，如果读取的长度是-1，表示文件结束。
			while ((len = bis.read(buf)) != -1) {
				// 读取到多少数据，就写入多少
				bos.write(buf, 0, len);
			}
			// 把读取到的数据转为byte[] 类型，保存在ImageFile的实例变量data中
			imageFile.data = bos.toByteArray();
		}
	}
}
